package org.svnadmin.service;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.svnadmin.constant.Constants;
import org.svnadmin.dao.PjGrUsrDao;
import org.svnadmin.entity.PjGrUsr;
import org.svnadmin.entity.Usr;

import javax.annotation.Resource;
import java.util.List;

/**
 * 项目组用户服务层
 *
 * @author <a href="mailto:yuanhuiwu@gmail.com">Huiwu Yuan</a>
 * @since 1.0
 */
@Service(PjGrUsrService.BEAN_NAME)
public class PjGrUsrService {
    /**
     * Bean名称
     */
    public static final String BEAN_NAME = "pjGrUsrService";
    /**
     * 项目组用户DAO
     */
    @Resource(name = PjGrUsrDao.BEAN_NAME)
    protected PjGrUsrDao pjGrUsrDao;

    /**
     * SVN服务层
     */
    @Resource(name = SvnService.BEAN_NAME)
    protected SvnService svnService;

    /**
     * @param pj  项目
     * @param gr  组
     * @param usr 用户
     * @return 组用户
     */
    public PjGrUsr get(String pj, String gr, String usr) {
        return pjGrUsrDao.get(pj, gr, usr);
    }

    /**
     * @param pj 项目
     * @param gr 组
     * @return 组用户列表
     */
    public List<PjGrUsr> list(String pj, String gr) {
        return pjGrUsrDao.getList(pj, gr);
    }

    /**
     * 保存
     *
     * @param pj   项目
     * @param gr   组
     * @param usrs 用户
     */
    @Transactional
    public void save(String pj, String gr, String[] usrs) {

        if (usrs == null || usrs.length == 0) {
            return;
        }

        for (String usr : usrs) {
            if (StringUtils.isBlank(usr)) {
                continue;
            }
            PjGrUsr pjGrUsr = new PjGrUsr();
            pjGrUsr.setPj(pj);
            pjGrUsr.setGr(gr);
            pjGrUsr.setUsr(usr);
            pjGrUsrDao.save(pjGrUsr);
        }
        // export
        svnService.exportConfig(pj);
    }

    /**
     * 删除
     *
     * @param pj  项目
     * @param gr  组
     * @param usr 用户
     */
    @Transactional
    public void delete(String pj, String gr, String usr) {
        pjGrUsrDao.delete(pj, gr, usr);
        svnService.exportConfig(pj);
    }

    /**
     * 是否有项目管理员的权限
     *
     * @param usr 用户
     * @param pj  项目
     * @return 有权限返回true, 否则返回false
     */
    public boolean hasManagerRight(Usr usr, String pj) {
        if (pj == null) {
            return false;
        }
        // TODO delete me 为了兼容3.0版本 see: Issue 4
        String gr = pj + "_" + Constants.GROUP_MANAGER;
        if (this.get(pj, gr, usr.getUsr()) != null) {
            return true;
        }
        // 3.0.1版本以后
        gr = Constants.GROUP_MANAGER;
        return this.get(pj, gr, usr.getUsr()) != null;
    }
}
